
#include "Sockets.h"
#define SOCK_PATH "echo_socket"
/*
 * Libería que permite realizar el manejo de sockets.
 * Nos focalizaremos en los de tipo UNIX, los más utilizados en la aplicación
 *
 */

int conectar(int iDescriptor_del_socket, char * sIP_remoto, int iPuerto_remoto_para_el_socket) {
	struct sockaddr_in structura_sockaddr;/*estructura para el Connect*/
	char sCadena_para_Log[22] = "\0";
	char error[50] = "\0";
	unsigned short usPort;
	char sIP[16] = "\0";
   
  

  if ((iDescriptor_del_socket=socket(AF_INET, SOCK_STREAM, 0))==-1){
  printf("Socket() error\n");
  exit(-1);
  }
  
	sprintf(sIP, sIP_remoto);
	structura_sockaddr.sin_family = AF_INET;
	structura_sockaddr.sin_addr.s_addr = inet_addr(sIP);
	structura_sockaddr.sin_port = htons(iPuerto_remoto_para_el_socket);
	bzero(&(structura_sockaddr.sin_zero), 8);

	sCadena_para_Log[strlen(sCadena_para_Log)] = '\0';
	strcat(sCadena_para_Log, " : ");

	if (connect(iDescriptor_del_socket, (struct sockaddr *) &structura_sockaddr,
			sizeof(struct sockaddr_in)) == -1)/*conect & check*/
	{
		perror(error);
		return 0;
	}

	return 1;
}
int conectarUnix(int iDescriptor_del_socket, struct sockaddr_un socket_un_struct,int len) {

	socket_un_struct.sun_family = AF_UNIX;
	strcpy(socket_un_struct.sun_path, SOCK_PATH);
	len = strlen(socket_un_struct.sun_path) + sizeof(socket_un_struct.sun_family);
	if (connect(iDescriptor_del_socket, (struct sockaddr *)&socket_un_struct, len) == -1) {
		perror("connect");
		exit(1);
		}

	return 1;
}

/*
 * Descripcion: Funcion que se encarga de crear el socket y asocia el mismo a una
 *
 */
/** Funcion que se encarga de crear el socket  AF_UNIX* */
int prepararSocketUnix(void) {
	int resultadoDePrepararSocket;
		resultadoDePrepararSocket=socket(AF_UNIX, SOCK_STREAM, 0);
		if ((resultadoDePrepararSocket) == -1) {
			perror("socket");
			exit(1);
			}

return resultadoDePrepararSocket;
}

/** Funcion que se encarga de crear el socket  AF_INET* */

int prepararSocketInet(char * NOMBRE_PROCESO) {
	int resultadoDePrepararSocket;
	resultadoDePrepararSocket=socket(AF_INET, SOCK_STREAM, 0);
	if ((resultadoDePrepararSocket) == -1) {
		perror("socket");
		exit(1);
		}

return resultadoDePrepararSocket;
}

/**Funcion que setea al socket en estado de escucha a la espera de conexiones**/

int escucha(int listener, int CantMaxClientes) {

	if (listen(listener, CantMaxClientes) == -1) {
		perror("listen");
		exit(1);
		}
	return 1;

}

/** Funcion que se encarga del cierre del socket**/
int cerrar(int iDescriptor_del_socket) {
	char sDescriptor_del_socket[16] = "\0";

	close(iDescriptor_del_socket);
	sprintf(sDescriptor_del_socket, "%i cerrado", iDescriptor_del_socket);

	return 1;
}





/**Función para poner a la escucha un socket**/

int escuchaSocketUN(int iDescriptor_del_socket, struct sockaddr_un socket_un_struct,int len) {

	socket_un_struct.sun_family = AF_UNIX;
	strcpy(socket_un_struct.sun_path, SOCK_PATH);

	unlink(socket_un_struct.sun_path);
	len = strlen(socket_un_struct.sun_path)
			+ sizeof(socket_un_struct.sun_family);

	if (bind(iDescriptor_del_socket, (struct sockaddr *) &socket_un_struct, len)
			== -1) {
		return 0;
	}


	/*if (listen(iDescriptor_del_socket, 1) == -1) {
		return 0;
	}*/

	return 1;
}
